package com.agua.enturno.modelo;

import com.agua.enturno.excepciones.ExcepcionDeReglaDelNegocio;
import com.agua.enturno.modelo.agenda.JornadaLaboralOcasional;
import com.agua.enturno.modelo.roles.Cliente;
import com.agua.enturno.modelo.turno.Horario;
import com.agua.enturno.modelo.turno.Turno;
import com.agua.enturno.util.Configuration;
import org.joda.time.DateTime;
import org.joda.time.Duration;
import org.joda.time.LocalDate;

/**
 * Clase que centraliza las reglas del negocio y expone metodos para validar el cumplimiento de las mísmas.
 *
 * @author Victor Del Rio
 */
public class ReglasDelNegocio {

	public static void noSePuedeSacarTurnosPasados(Horario horario) throws ExcepcionDeReglaDelNegocio {
		
		if (horario.getIntervalo().getEnd().isBeforeNow())
			throw new ExcepcionDeReglaDelNegocio("No se puede sacar turnos pasados");
		
	}
	
	public static void noSePuedeSacarTurnoSiNoSeRespetaLaAntelacionMaxima(Horario horarioDelTurno) throws ExcepcionDeReglaDelNegocio {
		
		if ( !horarioDelTurno.cumpleConAntelacionMaxima() )
			throw new ExcepcionDeReglaDelNegocio("No se puede sacar turno si no se respeta la antelacion maxima");
	}

	public static void noSePuedeSacarMasDeUnTurnoPorClienteEnUnMismoHorario(Cliente cliente, Turno turnoASacar) throws ExcepcionDeReglaDelNegocio {
		               
		for (Turno turnoDelCliente : cliente.getTurnos()) {
			
			Horario horario = turnoDelCliente.getHorario();
			
			if ( horario.equals(turnoASacar.getHorario()) ) 
				throw new ExcepcionDeReglaDelNegocio("No puede sacar más de un turno en un mismo horario");
		}
	}
	
	public static void noSePuedenCrearJornadasLaboralesPasadas(DateTime comienzoDeLaJornada) throws ExcepcionDeReglaDelNegocio {
		
		if ( comienzoDeLaJornada.isBeforeNow() )
			throw new ExcepcionDeReglaDelNegocio("No se pueden crear jornadas laborales pasadas");
	}
	
	public static void laDuracionDeLosTurnosDebeSerCoherenteConLaDeLaJornada(Duration duracionDelTurno, Duration duracionDeLosIntervalos) throws ExcepcionDeReglaDelNegocio {
		
		long minutosQueDuraElTurno = duracionDelTurno.getStandardMinutes();
		long minutosQueDuraLaJornada = duracionDeLosIntervalos.getStandardMinutes();
		
		if ( minutosQueDuraElTurno > minutosQueDuraLaJornada || minutosQueDuraLaJornada % minutosQueDuraElTurno != 0 )
			throw new ExcepcionDeReglaDelNegocio("La duracion de los turnos debe ser coherente con la de la jornada");
	}
	
	public static void noSePuedenAregarJornadasMuyLejanas(JornadaLaboralOcasional jornadaOcasional) throws ExcepcionDeReglaDelNegocio {
		
		if ( jornadaOcasional.getIntervalo().getEnd().isAfter(DateTime.now().plus(Configuration.getInstance().getAntelacionMaximaParaCreacionDeHorarios())) )
			throw new ExcepcionDeReglaDelNegocio("No se pueden agregar jornadas muy lejanas");
	}

	public static void noSePuedenCrearDiasNoLaboralesPasados(LocalDate fecha) throws ExcepcionDeReglaDelNegocio {
		
		if ( fecha.isBefore(LocalDate.now()) )
			throw new ExcepcionDeReglaDelNegocio("No se pueden crear dias no laborales pasados");
	}
	
	public static void laDuracionDeLosTurnosDebeSerMayorALaMinimaPermitida(Duration duracionDelHorario) throws ExcepcionDeReglaDelNegocio {
		
		if ( duracionDelHorario.isShorterThan(Horario.DURACION_MINIMA) )
			throw new ExcepcionDeReglaDelNegocio("La duracion del horario es menor a la duracion minima permitida");
	}

}
